package com.demo.java.OD451_500.OD492;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【字符串重新排列(B卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146429803
 */
public class OdMain {
    public static void main(String[] args) {
        // 创建 Scanner 对象读取输入
        Scanner scanner = new Scanner(System.in);
        String inputStr = scanner.nextLine();

        // 1. 分割输入字符串，得到单词列表
        String[] inputList = inputStr.split(" ");

        // 2. 对每个单词内部进行字母排序
        List<String> newList = new ArrayList<>();
        for (String singleStr : inputList) {
            char[] charArray = singleStr.toCharArray();
            Arrays.sort(charArray);  // 排序
            newList.add(new String(charArray));  // 排序后的字符串加入新列表
        }

        // 3. 定义自定义比较函数，比较单词的出现频率及字母顺序
        Comparator<Map.Entry<String, Integer>> comp = new Comparator<Map.Entry<String, Integer>>() {
            public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) {
                // 1. 比较单词出现频率
                if (a.getValue() > b.getValue()) {
                    return -1;
                } else if (a.getValue() == b.getValue()) {
                    // 2. 如果出现频率相同，比较单词长度
                    if (a.getKey().length() > b.getKey().length()) {
                        return 1;
                    } else if (a.getKey().length() == b.getKey().length()) {
                        // 3. 如果长度也相同，按字典顺序比较
                        return a.getKey().compareTo(b.getKey());
                    } else {
                        return -1;
                    }
                } else {
                    return 1;
                }
            }
        };

        // 4. 统计每个单词的出现次数
        Map<String, Integer> strCount = new HashMap<>();
        for (String singleStr : newList) {
            strCount.put(singleStr, strCount.getOrDefault(singleStr, 0) + 1);
        }

        // 5. 将统计结果转换为列表并进行排序
        List<Map.Entry<String, Integer>> sortedList = new ArrayList<>(strCount.entrySet());
        sortedList.sort(comp);  // 使用自定义比较函数进行排序

        // 6. 输出最终结果
        StringBuilder resStr = new StringBuilder();
        for (Map.Entry<String, Integer> item : sortedList) {
            for (int i = 0; i < item.getValue(); i++) {
                resStr.append(item.getKey()).append(" ");
            }
        }

        // 输出结果
        System.out.println(resStr.toString().trim());  // 去掉末尾的空格
    }
}